# 导入pandas库
import pandas as pd

# 读取csv文件
df = pd.read_csv('static/data/anime_clean.csv')


# 定义一个函数rating_anime，用于获取评分最高的前10部动漫
def rating_anime():
    # 根据评分从高到低排序
    df_top10_rating = df.sort_values(by='rating', ascending=False)
    # 获取title列表
    title = df_top10_rating['title'].values.tolist()
    # 获取rating列表
    rating = df_top10_rating['rating'].values.tolist()
    # 返回title和rating列表
    return {
        'name': title,
        'value': rating
    }


# 定义一个函数status_pie，用于获取动漫更新状态的饼图
def status_pie():
    # 从df中获取status中包含“更新”的行
    df_serial = df[df['status'].str.contains('更新')]
    # 返回一个字典，其中包含书动漫更新状态的饼图
    return {
        'data': [{'type': '连载', 'value': int(df_serial['status'].count())},
                 {'type': '完结', 'value': len(df) - int(df_serial['status'].count())}]
    }


# 定义一个函数type_count_top10，用于获取类型数量前10
def type_count_top10():
    # 将df中anime_type列的值拼接成字符串，并以|分割，并将结果赋值给df_bar
    df_bar = pd.DataFrame('|'.join(df['anime_type'].values.tolist()).split('|'), columns=['name'])
    df_bar = df_bar[df_bar['name'] != '大陆']
    # 按照name列分组，统计每个name列的value值，并将结果重命名为value，并按照value值降序排列，取前10行
    df_bar = (
        df_bar.groupby('name')
        .value_counts()
        .reset_index()
        .rename(columns={'count': 'value'})
        .sort_values(by='value', ascending=False)
        .head(10)
    )
    # 返回一个字典，其中包含data属性，data属性是一个列表，列表中的每个元素是一个字典，字典中包含type和value属性
    return {
        'data': [{'type': i[0], 'value': i[1]} for i in df_bar.values]
    }


# 定义函数year_anime_count，用于统计每个年份的动漫数量
def year_anime_count():
    # 从df中筛选出date不为'无'的行，并按照date进行分组，统计title的数量，最后将结果以date进行排序
    df_area = df[df['date'] != '无'].groupby('date')['title'].count().reset_index().sort_values('date')
    # 返回一个字典，其中包含一个列表，列表中包含每个年份的动漫数量
    return {
        'data': [{'year': i[0], 'value': i[1]} for i in df_area.values.tolist()]
    }


# 定义一个函数type_word_count，用于统计df中anime_type列的值出现的次数
def type_word_count():
    # 将df中anime_type列的值拼接成一个字符串，并以|分割
    df_type_count = pd.DataFrame('|'.join(df['anime_type'].values.tolist()).split("|"), columns=['type'])
    df_type_count = df_type_count[df_type_count['type'] != '大陆']
    # 将df_type_count按照type列分组，并统计每组中type列的值出现的次数
    data = df_type_count.groupby('type').value_counts().reset_index().rename(columns={'count': 'value'}).sort_values(
        by='value', ascending=False)
    # 返回一个字典，其中包含一个列表，该列表包含统计结果，并按照value值降序排列
    return {
        'data': [{'name': i[0], 'value': i[1]} for i in data.values.tolist()]
    }


# 定义rating_scatter函数
def rating_scatter():
    # 获取df中anime_type列的值，并将其转换为集合
    anime_type = [i for i in set(''.join(df['anime_type'].values.tolist()).split("|")) if i != '大陆']
    # 遍历anime_type集合，获取每个元素在df中出现的次数，并将其存入data列表中
    data = [
        {
            'rating': j[0],
            'value': j[1],
            'type': i
        } for i in anime_type
        for j in df[df['anime_type'].str.contains(i)]
        .groupby('rating')['title']
        .count()
        .reset_index()
        .sort_values('rating')
        .values
        .tolist()
    ]
    # 返回data列表
    return {
        'data': data
    }
